#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char const *argv[])
{
    char* str = "hello\n";
    printf("str=%s", str);
    
    fprintf(stdout,"str2=%s", str);

    char *buf = "hello\n";

    ssize_t a = write(STDOUT_FILENO, buf, strlen(buf));
    printf("%d--%d--%d\n", STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO);
 
    return 0;
}
/*
    1.stdout不是语句，而是文件流(file stream)的一个标识符，用来表示标准输
出流。在C语言中，stdout是一个指向标准输出设备(通常是屏幕)的文件流指针！！它
是一个FILE*类型的指针。指向由操作系统打开的标准输出设备，通常是终端或命令行
界面。stdout 并不是一个普通的语句或函数，而是一个文件流对象，像文件一样，它
可以与文件操作函数一起使用，进行读写。  

    2.ssize_t 是专门设计用于表示 I/O 操作的返回值类型，并且比常规的 unsigned、
int 或 long 类型更符合某些特定需求。以下是为什么 ssize_t 被引入的原因，以及为
什么在这种情况下不能直接使用 unsigned、int 或 long 类型。1. 表示负值的需求.ssize_t 
是有符号的（signed），这使得它能够表示负值。这在处理系统调用（如 read() 或 write()
时非常重要，因为：成功时，返回的值是非负数，表示实际操作的字节数。失败时，返回值是-1，
并且通常会设置 errno 来指示具体的错误类型。如果使用 unsigned 类型（无符号类型），它
不能表示负数，因此无法处理错误的情况。即使在使用 int 或 long 的情况下，如果我们只关
心字节数，unsigned 类型在逻辑上是合理的，但它仍然不能完全涵盖所有的返回值需求，特别
是无法表示负数。2. size_t 与 ssize_t 的区别。size_t 是一个无符号类型，通常用于表示
对象的大小（如内存分配的字节数）。它能够表示从 0 到最大值的范围，但不能表示负值。在
处理内存大小、数组索引等时，它非常合适。ssize_t 是一个有符号类型，能够表示正值和负
值，适用于表示操作结果或字节数（例如 read() 或 write()）时，能够区分成功和失败的情况。
例如，如果直接使用 unsigned 类型，它将不能处理返回值为负数的情况。因此，使用 ssize_t 
使得系统调用返回值可以在表示字节数的同时，能够处理失败的情况（如 -1）。


*/
